package com.luzhikun.xianLiva;

import javax.swing.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author shkstart
 * @create 2021-03-12 21:49
 */
public class XianLiveMain {
    //玩家
    Player player;
    //存放所有的商品
    private List<Product> allProduct = new ArrayList<Product>();
    //市場商品列表
    private List<Product> marketPros = new ArrayList<Product>();
    //玩家出生地 默认：长安
    Address playerNowAddress = Address.CHANG_AN;
    //默认当前天数为0
    private int day = 0;
    //游戏运行标志
    boolean isFlag = true;
    //出租屋的货物
    private List<Product> sellHomePros = new ArrayList<>();
    //最大游戏天数
    private static final int MAX_DAY = 40;
    //玩家的欠款利息为每天百分之10
    private static final double prefit = 1.1;


    public void run() {
        String info = "---------------------------------- 西安浮生 ---------------------------------\n" +
                "   在本游戏中，您扮演一位从外地到西安谋生的青年。一开始，您只有2000元钱，并且还欠村长5500元\n" +
                "债务。这些债务每天的利息高达10%.如果不及时还清，村长会叫老乡来扁您，您可能牺牲在   西安街头。\n" +
                "您决定在西安二环路地铁口的黑市倒卖各种物品来发财致富，不仅还掉债务，而且要荣登   西安富人排行榜.\n" +
                "您只能在西安呆" + MAX_DAY + "天，每次从一个黑市奔走到另一个黑市算一天。\n" +
                "您会在西安遭遇到各种事件，让您感到西安浮生之艰难，世态之炎凉，我们这个时代强烈的荒谬感。";
        JOptionPane.showMessageDialog(null, info);
        //初始化遊戲
        initGame();
        //显示界面
        viewGame();

    }

    /*
     * 显示游戏界面
     *
     * */
    private void viewGame() {
        String info = "------------------ 当前游戏 %2d/%2d天-------------------------------------------------\n" +
                "---玩家信息：%s\n" +
                "--- 黑市：%s------------------------------------------------------------------------------\n" +
                "%s\n\n" +
                "--- 西安地图------------------------------------------------------------------------------\n" +
                "%s\n\n" +
                "--- 操作：请使用一个空格分隔输入参数 ---------------------------------------------------------\n" +
                "0- 逛西安   1- 买入   2- 卖出   3- 还款   4- 退出游戏";

        while (isFlag) {
            String input = JOptionPane.showInputDialog(String.format(info, this.day, MAX_DAY, this.player.toString(), this.playerNowAddress, getMarketPros(), this.getMapPros()));
            //输入格式校验
            if (input == null || input.trim().isEmpty() ||
                    !input.matches("(0 ([1-9]|10)|[1-2] [1-9] [1-9]\\d*|3 [1-9]\\d*|4)")) {
                JOptionPane.showMessageDialog(null, "输入错误,请重新输入");
                continue;
            }

            isFlag = anliInput(input);
        }
    }

    /*
     *
     * 解析输入
     *
     * */
    public boolean anliInput(String input) {
        String[] inputs = input.split(" ");
        switch (Integer.parseInt(inputs[0])) {
            case 0:
                chageAddress(Integer.parseInt(inputs[1]));
                break;
            case 1:
                buyPros(inputs);
                break;
            case 2:
                sellPro(inputs);
                break;
            case 3:
                backMoney(inputs);
                break;
            case 4:
                isFlag = false;

        }
        return isFlag;
    }

    /*
     *
     * 解析还款
     *
     * */
    private void backMoney(String[] inputs) {
        //获取要还的欠款
        int backMoney = Integer.parseInt(inputs[1]);
        //判断是否还完
        if (backMoney == this.player.getDept()) {
            this.player.setDept(0);
        } else {
            this.player.setDept(this.player.getDept() - backMoney);
        }

    }

    /*
     *
     * 出售商品
     *
     * */
    private void sellPro(String[] inputs) {

        //index 为当前玩家出租屋的货物位置
        int index = Integer.parseInt(inputs[1]) - 1;
        //判断出租屋是否有这个货物
        if (index < 0 || index > this.player.getProList().size()) {
            JOptionPane.showMessageDialog(null, "出租屋无此商品，请正确输入", "Error", JOptionPane.ERROR_MESSAGE);
            return;
        }
        //要出售的货物
        PlayProduct playSellPro = this.player.getProList().get(index);
//        //判断当前市场有无此商品
//        if (this.marketPros.contains(playPro)){
//            //获取当前市场该货物的价格
//            int price=this.marketPro
//
//        }
        //要出售的数量
        int count = Integer.parseInt(inputs[2]);
        //判断数量是否足够
        if (count > playSellPro.getCount()) {
            JOptionPane.showMessageDialog(null, "输入数量有误，请重新输入", "Error", JOptionPane.ERROR_MESSAGE);
            return;
        }
        //判断是否卖光
        if (count == playSellPro.getCount()) {
            this.player.getProList().remove(playSellPro);
        } else {
            //减去卖去的数量
            this.player.getProList().get(index).setCount(playSellPro.getCount() - count);
        }
        //赚的钱
        this.player.setMoney(this.player.getMoney() + playSellPro.getNowPrice() * count);
        //返回出租屋容量
        this.player.setProCapacity(this.player.getProCapacity() + count);


    }
    /*
     * 买入商品
     *
     * */

    private void buyPros(String[] inputs) {
        int index = Integer.parseInt(inputs[1]) - 1;
        //判断是否超界
        if (index < 0 || index > marketPros.size()) {
            JOptionPane.showMessageDialog(null, "输入商品位置无效", "Error", JOptionPane.ERROR_MESSAGE);
            return;
        }
        //获取当前市场里的商品
        Product product = this.marketPros.get(index);
        //判断钱数是否够
        int count = Integer.parseInt(inputs[2]);
        if (this.player.getMoney() < count * product.getNowPrice()) {
            JOptionPane.showMessageDialog(null, "现金不足", "Error", JOptionPane.ERROR_MESSAGE);
            return;
        }
        //判断数量是否超界
        if (this.player.getProCapacity() < this.player.getProList().size() + count) {
            JOptionPane.showMessageDialog(null, "出租屋空间不足", "Error", JOptionPane.ERROR_MESSAGE);
            return;
        }
        //判断是否买过
        int proIndex = this.player.getProList().indexOf(product);
        //购买过
        if (proIndex != -1) {
            //平均价格
            int avgPrice = (this.player.getProList().get(proIndex).getAllPrice() + count * product.getNowPrice()) /
                    (count + this.player.getProList().get(proIndex).getCount());
            this.player.getProList().get(proIndex).setNowPrice(avgPrice);
            this.player.getProList().get(proIndex).setCount(this.player.getProList().get(proIndex).getCount() + count);

        } else {
            //没有购买过
            this.player.getProList().add(new PlayProduct(product, count));

        }
        //扣除现金
        this.player.setMoney(this.player.getMoney() - count * product.getNowPrice());
        //扣除出租屋容量
        this.player.setProCapacity(this.player.getProCapacity() - count);


    }

    /*
     *
     *切换地址
     *
     * */
    private boolean chageAddress(int index) {
        //换算地址角标从0开始
        index--;
        //判断当前天数是否是最大游戏天数
        if (day == MAX_DAY - 1) {
            JOptionPane.showMessageDialog(null, "时间到了,你该回家娶媳妇了");
            return false;
        }
        //判断是否是同一个地址
        if (this.playerNowAddress == Address.values()[index]) {
            return true;
        }
        //切换地址
        this.playerNowAddress = Address.values()[index];
        //每切换一次,对天数+1
        day += 1;
        //每切换一次，欠款利息加百分之10
        this.player.setDept(this.player.getDept() * prefit);
        //重新构建黑市商品
        initMarketpros();
        return true;
    }

    /*
     * 获取黑市商品信息
     *
     * */
    private String getMarketPros() {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < marketPros.size(); i++) {
            sb.append(i + 1).append("- ").append(marketPros.get(i).toString()).append("  ");
            if (i != 0 && i % 3 == 0) {
                sb.append("\n");
            }

        }
        return sb.toString();
    }

    /*
     * 获取地图信息
     *
     * */
    private String getMapPros() {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < Address.values().length; i++) {
            sb.append(i + 1).append("- ").append(Address.values()[i].toString()).append("  ");
            if (i != 0 && i % 4 == 0) {
                sb.append("\n");
            }

        }
        return sb.toString();
    }


    //初始化遊戲
    private void initGame() {
        //初始化玩家
        initPlayer();
        //初始化商品
        initpros();
        //構建當前黑市商品
        initMarketpros();

    }

    private void initPlayer() {

        String name = JOptionPane.showInputDialog("请输入你的ID");
        while (name == null || name.trim().isEmpty() || name.length() > 20) {
            name = JOptionPane.showInputDialog("请正确输入你的ID");
        }
        //添加名字
        player = new Player(name);
    }

    //初始化商品
    private void initpros() {
        this.allProduct.add(new Product(1, "盗版DVD", 4, 35));
        this.allProduct.add(new Product(2, "野生奥特曼", 998, 20000));
        this.allProduct.add(new Product(3, "小电驴", 500, 3000));
        this.allProduct.add(new Product(4, "走私汽车", 20000, 100000));
        this.allProduct.add(new Product(5, "西安小宝贝", 1000, 2000));
        this.allProduct.add(new Product(6, "盗版手机", 200, 1500));
        this.allProduct.add(new Product(7, "青花瓷", 100, 5000));
        this.allProduct.add(new Product(8, "仿真古董", 100, 10000));
        this.allProduct.add(new Product(9, "小霸王", 30, 1200));
        this.allProduct.add(new Product(10, "山寨球鞋", 150, 800));
        this.allProduct.add(new Product(11, "PSP游戏机", 60, 500));
        this.allProduct.add(new Product(12, "摇头丸", 50, 1500));
    }

    /*
     * 初始化市場商品
     *
     * */
    private void initMarketpros() {
        Set<Product> marketSet = new HashSet<>();
        //隨機商品個數
        int countPros = (int) (Math.random() * (7 - 4 + 1) + 4);
        //隨機取商品放入當前市場中

        while (marketSet.size() < countPros) {
            //随机商品
            int randomIndex = (int) (Math.random() * (11) + 1);
            //随机取某个商品
            Product randomPro = allProduct.get(randomIndex);
            //随机商品价格
            randomPro.randomNowPrice();
            //隨機取市場商品
            marketSet.add(randomPro);
        }
        //清理之前的商品,不然每次都会接着添加
        this.marketPros.clear();
        //将上述商品添加到当前市场中
        this.marketPros.addAll(marketSet);
    }


}
